package com.javaweb.controller


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
import com.javaweb.pojo.SysMessage
import com.javaweb.pojo.VoteOption
import com.javaweb.pojo.VoteRecord
import com.javaweb.service.SysMessageService
import com.javaweb.service.SysVoteService
import com.javaweb.service.VoteOptionService
import com.javaweb.service.VoteRecordService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import java.util.*

@Controller
class StudentController : BaseController() {
    /**
     * sysVoteService是sys_vote表（投票表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var sysVoteService: SysVoteService

    /**
     * sysMessageService是sys_message表（留言表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var messageService: SysMessageService

    /**
     * voteOptionService是vote_option表（投票选项表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var voteOptionService: VoteOptionService

    /**
     * voteRecordService是vot_record表（投票记录表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var voteRecordService: VoteRecordService

    /**
     * 用户查看投票情况
     * @PreAuthorize("hasAuthority('STUDENT')")表示只有学生权限的用户才能访问
     * @RequestMapping("/view/{voteId}") view请求的地址，voteId为携带的参数，接受所有方式（get，post...）的请求
     * @param voteId 为投票项的id
     * @param model 是传送到前台的数据对象
     */
    @PreAuthorize("hasAuthority('STUDENT')")
    @RequestMapping("/view/{voteId}")
    fun viewVote(@PathVariable voteId: Long, model: Model): String {
        /*
            通过id查询sys_vote的基本数据
         */
        val sysVote = sysVoteService.getById(voteId)
        /*
            查询投票项的留言
         */
        sysVote.message = messageService.list(QueryWrapper<SysMessage>().eq("vote_id", sysVote.voteId))
        /*
            查询投票项的选项
         */
        sysVote.options = voteOptionService.list(QueryWrapper<VoteOption>().eq("vote_id", sysVote.voteId))
        /*
            查询留言人的用户名
         */
        (sysVote.message as MutableList<SysMessage>?)?.forEach {
            it.userName = sysUserService?.getById(it.userId)?.userName
        }
        /*
           设置传送到前端的数据，data是投票表的所有信息，flag用来判断用户是否能投票
         */
        model["data"] = sysVote
        model["flag"] = false
        /*
            检查投票是否截止
         */
        if (sysVote.endTime!!.before(Date())) {
            model["flag"] = true
            model["choose"] = "投票已超过截止时间"
            return "studentView"
        }

        /*
          查询用户是否投票
         */
        val list = voteRecordService.getOne(
            QueryWrapper<VoteRecord>().eq("user_id", getSysUserId())
                .and {
                    it.inSql("option_id", "select option_id from vote_option where vote_id = ".plus(voteId))
                }
        )
        model["flag"] = list != null
        /*
            若用户已经投票，通过上面查到的选项，判断是哪一项
         */
        (sysVote.options as MutableList<VoteOption>?)?.forEach {
            if (list != null && it.optionId == list.optionId) {
                model["choose"] = "你已参与投票，你选择的是".plus(it.optionName!!)

            }
        }
        /*
            设置跳转的页面
         */
        return "studentView"
    }

    /**
     * 学生投票
     * @PreAuthorize("hasAuthority('STUDENT')") 学生权限
     * @RequestMapping("/submit")  请求的地址为/submit，接受所有方式（get，post...）的请求
     * @param optionId 投票项的id
     * @param voteId 投票项的id，用来在完成投票返回到相应的页面
     * @param model 是传送到前台的数据对象
     */
    @PreAuthorize("hasAuthority('STUDENT')")
    @RequestMapping("/submit")
    fun submit(@RequestParam optionId: Long, @RequestParam voteId: Long, model: Model): String {
        /*
            构造一个对象用于插入
         */
        val voteRecord = VoteRecord()
        voteRecord.optionId = optionId
        voteRecord.userId = getSysUserId()
        voteRecord.recordTime = Date()
        /*
            判断是否插入成功
         */
        val save = try {
            voteRecordService.save(voteRecord)
        } catch (e: Exception) {
            println("投票出错")
            true
        }
        /*
            设置已投票信息信息
         */
        model["message"] = (if (save) {
            "你已参与投票"
        } else {
            null
        })!!
        /*
            转发到之前查看的页面，转发和重定向的区别，重定向请求两次，转发请求一次，转发url不变，重定向变化
         */
        return "forward:/view/".plus(voteId)
    }

}